package string;

import java.util.ArrayList;
import java.util.List;

/**
 * 给你一个字符串 caption，表示一个视频的标题。
 * 需要按照以下步骤 按顺序 生成一个视频的 有效标签 ：
 * 将 所有单词 组合为单个 驼峰命名字符串 ，并在前面加上 '#'。驼峰命名字符串 指的是除第一个单词外，其余单词的首字母大写，且每个单词的首字
 * 母之后的字符必须是小写。
 * 移除 所有不是英文字母的字符，但 保留 第一个字符 '#'。
 * 将结果 截断 为最多 100 个字符。
 * 对 caption 执行上述操作后，返回生成的 标签 。
 * <p>
 * 示例 1：
 * 输入： caption = "Leetcode daily streak achieved"
 * 输出： "#leetcodeDailyStreakAchieved"
 * 解释：
 * 除了 "leetcode" 以外的所有单词的首字母需要大写。
 * <p>
 * 示例 2：
 * 输入： caption = "can I Go There"
 * 输出： "#canIGoThere"
 * 解释：
 * 除了 "can" 以外的所有单词的首字母需要大写。
 * <p>
 * 示例 3：
 * 输入： caption = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
 * 输出： "#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
 * 解释：
 * 由于第一个单词长度为 101，因此需要从单词末尾截去最后两个字符。
 *
 * @author Jisheng Huang
 * @version 20250615
 */
public class GenerateTag_Contest454_Q1 {
    public static String generateTag(String caption) {
        // Edge case
        if (caption == null || caption.isEmpty()) {
            return "#";
        }

        String[] words = caption.split("\\s+");
        List<String> nonEmptyWords = new ArrayList<>();

        for (String word : words) {
            if (!word.isEmpty()) {
                nonEmptyWords.add(word);
            }
        }

        if (nonEmptyWords.isEmpty()) {
            return "#";
        }

        StringBuffer sb = new StringBuffer();
        sb.append("#");

        String firstWord = nonEmptyWords.get(0);

        // Convert the firstWord to all lowercase
        for (char c : firstWord.toCharArray()) {
            if (Character.isLetter(c)) {
                sb.append(Character.toLowerCase(c));
            }
        }

        for (int i = 1; i < nonEmptyWords.size(); ++i) {
            String word = nonEmptyWords.get(i);

            if (word.isEmpty()) {
                continue;
            }

            boolean firstCharProcessed = false;

            for (char c : word.toCharArray()) {
                if (Character.isLetter(c)) {
                    if (!firstCharProcessed) {
                        sb.append(Character.toUpperCase(c));
                        firstCharProcessed = true;
                    } else {
                        sb.append(Character.toLowerCase(c));
                    }
                }
            }
        }

        String res = sb.toString();

        if (res.length() > 100) {
            return res.substring(0, 100);
        }

        return res;
    }

    public static void main(String[] args) {
        String caption = "Leetcode daily streak achieved©leetcode";
        System.out.println(generateTag(caption));

        caption = "can I Go There©leetcode";
        System.out.println(generateTag(caption));

        caption = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
        System.out.println(generateTag(caption));

        caption = " fPysaRtLQLiMKVvRhMkkDLNedQKffPnCjbITBTOVhoVjiKbfSawvpisDaNzXJctQkn";
        System.out.println(generateTag(caption));
    }
}
